home *** CD-ROM | disk | FTP | other *** search
/ Just Call Me Internet / Just Call Me Internet.iso / prog / atari / m2 / cat3src / magic / i / mttext.i < prev    next >
Encoding:
Modula Implementation  |  1997-10-26  |  11.7 KB  |  391 lines

  1. (*----------------------------------------------------------------------*
  2.  *                                                                      *
  3.  *         MAGIC   Modula's  All purpose  GEM  Interface  Cadre         *
  4.  *                 ÿ         ÿ            ÿ    ÿ          ÿ             *
  5.  *----------------------------------------------------------------------*
  6.  * Version 3.30  02.02.1992     (C)90/91/92 by Peter Hellinger Software *
  7.  *----------------------------------------------------------------------*
  8.  *            Dieses Modul ist urheberrechtlich geschtzt.              *
  9.  *                                                                      *
  10.  * Die Ver”ffentlichung des Quelltextes oder Teilen daraus in schrift-  *
  11.  * licher Form, insbesondere in Zeitschriften, sowie die Verbreitung    *
  12.  * ber Public-Domain-H„ndler bedarf der ausdrcklichen schriftlichen   *
  13.  * Genehmigung des Autors!                                              *
  14.  *                                                                      *
  15.  * Der Autor gibt hiermit die ausdrckliche Erlaubnis, das Modul jeder- *
  16.  * zeit auch im Quelltext weiterzugegeben, sofern dessen Text und ins-  *
  17.  * besondere dieser Urheberrechts-Vermerk nicht ver„ndert wird, und     *
  18.  * durch die Weitergabe kein finanzieller Nutzen entsteht. Der Autor    *
  19.  * beh„lt sich das Recht vor, diese Erlaubnis jederzeit u. ohne Angaben *
  20.  * von Grnden zu widerrufen.                                           *
  21.  *----------------------------------------------------------------------*)
  22.  
  23. IMPLEMENTATION MODULE mtText;
  24.  
  25. (*----------------------------------------------------------------------*
  26.  * Int. Vers | Datum    | Name | Žnderung                               *
  27.  *-----------+----------+------+----------------------------------------*
  28.  *  3.00     | 18.01.92 |  Hp  |                                        *
  29.  *  3.01     | 02.02.92 |  Hp  | Modul um LengthLine erg„nzt            *
  30.  *-----------+----------+------+----------------------------------------*)
  31.  
  32.  
  33.  
  34. (* IMPLEMENTATION FšR  >>> Megamax-Modula-2 <<< *)
  35. (*                                              *)
  36. (*$R-   Range-Checks                            *)
  37. (*$S-   Stack-Check                             *)
  38. (*                                              *)
  39. (*----------------------------------------------*)
  40.  
  41.  
  42.  
  43.  
  44.  
  45.  
  46. FROM MagicSys   IMPORT  Nil, Null, Bit0, Bit1, Bit2, Bit3, Bit4, Bit5, Bit6,
  47.                         Bit7, Bit8, Bit9, Bit10, Bit11, Bit12, Bit13, Bit14,
  48.                         Bit15, LOC, Byte, ByteSet, sWORD, sINTEGER, sCARDINAL,
  49.                         sBITSET, lINTEGER, lCARDINAL, lWORD, lBITSET,
  50.                         CastToChar, CastToByte, CastToByteset, CastToInt,
  51.                         CastToCard, CastToBitset, CastToWord, CastToLInt,
  52.                         CastToLCard, CastToLBitset, CastToLWord, CastToAddr,
  53.                         TosVersion, Accessory, Basepage, SysHeader, TosDate;
  54.  
  55.  
  56.  
  57.  
  58.  
  59.  
  60.  
  61.  
  62. FROM Storage IMPORT ALLOCATE, DEALLOCATE;
  63.  
  64.  
  65.  
  66.  
  67. FROM SYSTEM     IMPORT  ADDRESS, ADR, TSIZE;
  68. FROM MagicStrings IMPORT Length, Pos, Assign, Append;
  69. FROM mtTextfiles IMPORT TEXTFILE, Textmode, OpenTextfile, CloseTextfile,
  70.                         Reset, EndofText, WriteLn, WriteLine, ReadLn,
  71.                         ReadLine; 
  72.  
  73.  
  74. CONST   CR =            15C;
  75.         LF =            12C;
  76.         MaxEOL =        19;     (* max. L„nge des EondOfLine-Strings *)
  77.         MaxStatic =     7;      (* max. L„nge des alt. statischen Strings *)
  78.  
  79.  
  80. TYPE    STRING =        RECORD
  81.                          CASE b: BOOLEAN OF
  82.                           TRUE:  ptr: PtrString;
  83.                                  len: lCARDINAL;|
  84.                           FALSE: str: ARRAY [0..MaxStatic] OF CHAR;
  85.                          END;
  86.                         END;
  87.  
  88. TYPE    LINE =          POINTER TO Line;
  89.         Line =          RECORD
  90.                          string: STRING; (* Der Stringspeicher *)
  91.                          dyn:    BOOLEAN;
  92.                          next:   LINE;   (* N„chste Zeile *)
  93.                          last:   LINE;   (* vorhergehende Zeile *)
  94.                         END;
  95.  
  96. TYPE    TEXT =          POINTER TO Text;
  97.         Text =          RECORD
  98.                          firstline: LINE; (* Erste Zeile des Textes *)
  99.                          lastline:  LINE; (* Letzte Zeile des Textes *)
  100.                          eol:       ARRAY [0..MaxEOL] OF CHAR;
  101.                                     (* EndOfLine-String, normal CR/LF *)
  102.                         END;
  103.  
  104.  
  105. PROCEDURE NewTEXT (VAR text: TEXT): BOOLEAN;
  106. BEGIN
  107.  ALLOCATE (text,  TSIZE (Text));  
  108.  IF text = NIL THEN RETURN FALSE;  END;
  109.  text^.firstline:= NIL;
  110.  text^.lastline:= NIL;
  111.  text^.eol[0]:= CHR (0DH);
  112.  text^.eol[1]:= CHR (0AH);
  113.  text^.eol[2]:= CHR (00H);
  114.  RETURN TRUE;
  115. END NewTEXT;
  116.  
  117. PROCEDURE DisposeTEXT (VAR text: TEXT);
  118. VAR d: LINE;
  119. BEGIN
  120.  IF text = NIL THEN  RETURN;  END;
  121.  WHILE text^.firstline # NIL DO  (* Erst die Zeilen des Textes l”schen *)
  122.   DisposeLine (text^.firstline);
  123.  END;
  124.  DEALLOCATE (text, 0);  
  125.  text:= NIL;
  126. END DisposeTEXT;
  127.  
  128. PROCEDURE NewString (VAR s: STRING; REF string: ARRAY OF CHAR): INTEGER;
  129. (* -1 = Fehlgeschlagen
  130.  *  0 = Statischer String
  131.  *  1 = Dynamischer String
  132.  *)
  133. VAR l: sCARDINAL;  i: sINTEGER;
  134. BEGIN
  135.  l:= Length (string);  INC (l);  i:= 0;
  136.  IF l < MaxStatic THEN (* Kleiner als ein Pointer... *)
  137.   Assign (string, s.str);
  138.  ELSE 
  139.   ALLOCATE (s.ptr,  LONG(l));   (* Den Stringspeicher allozieren *)
  140.   IF s.ptr # NIL THEN  Assign (string, s.ptr^); s.len:= LONG(l);  i:= 1;
  141.                  ELSE  i:= -1;
  142.   END;
  143.  END;
  144.  RETURN i;
  145. END NewString;
  146.  
  147. PROCEDURE NewLine (VAR line: LINE; REF string: ARRAY OF CHAR): BOOLEAN;
  148. VAR i: sINTEGER;
  149. BEGIN
  150.  line:= NIL;
  151.  ALLOCATE (line,  TSIZE (Line));  
  152.  IF line = NIL THEN  RETURN FALSE;  END;
  153.  i:= NewString (line^.string, string);
  154.  IF i < 0 THEN
  155.   DEALLOCATE (line, 0);    line:= NIL;  RETURN FALSE;
  156.  END;
  157.  line^.dyn:= i = 1;  line^.last:= NIL;  line^.next:= NIL;
  158.  RETURN TRUE;
  159. END NewLine;
  160.  
  161. PROCEDURE InsertLine (VAR text: TEXT; line, after: LINE);
  162. BEGIN
  163.  IF text = NIL THEN  RETURN;  END;
  164.  IF after = NIL THEN
  165.   (* Zeile wird erste Zeile des Textes *)
  166.   line^.last:= NIL; (* Vorg„nger gibt es nicht! *)
  167.   line^.next:= text^.firstline;
  168.   IF text^.firstline # NIL THEN  text^.firstline^.last:= line;  END;
  169.   text^.firstline:= line;
  170.   IF text^.lastline = NIL THEN text^.lastline:= text^.firstline;  END;
  171.  ELSIF (after = text^.lastline) THEN
  172.   (* An Text anh„ngen *)
  173.   line^.last:= text^.lastline;
  174.   line^.next:= NIL; (* Gibt keinen Nachfolger *)
  175.   text^.lastline^.next:= line;
  176.   text^.lastline:= line;
  177.  ELSE (* Zeile zwischendrin einfgen *)
  178.   line^.last:= after;
  179.   line^.next:= after^.next;
  180.   after^.next:= line; 
  181.  END;
  182. END InsertLine;
  183.  
  184. PROCEDURE InsertText (VAR text, insert: TEXT; after: LINE);
  185. VAR d: LINE;
  186. BEGIN
  187.  IF (text = NIL) OR (insert = NIL) THEN  RETURN;  END;
  188.  IF (insert^.firstline = NIL) THEN  RETURN;  END;
  189.  IF after = NIL THEN
  190.   d:= text^.firstline;
  191.   text^.firstline:= insert^.firstline;
  192.   insert^.lastline^.next:= d;
  193.   d^.last:= insert^.lastline;
  194.  ELSIF (after = text^.lastline) THEN
  195.   text^.lastline^.next:= insert^.firstline;
  196.   insert^.firstline^.last:= text^.lastline;
  197.   text^.lastline:= insert^.lastline;
  198.  ELSE (* Zeile zwischendrin einfgen *)
  199.   after^.next^.last:= insert^.lastline;
  200.   insert^.lastline^.next:= after^.next;
  201.   after^.next:= insert^.firstline;
  202.  END;
  203.  insert^.firstline:= NIL;
  204.  insert^.lastline:= NIL;
  205. END InsertText;
  206.  
  207. PROCEDURE PutLine (line: LINE; REF string: ARRAY OF CHAR): BOOLEAN;
  208. VAR i: sINTEGER;
  209.     s: STRING;
  210. BEGIN
  211.  IF line # NIL THEN
  212.   i:= NewString (s, string);
  213.   IF i < 0 THEN  RETURN FALSE;  END;
  214.   line^.dyn:= i = 1;
  215.   IF line^.dyn THEN
  216.    DEALLOCATE (line^.string.ptr, 0);  
  217.    line^.string.ptr:= s.ptr;
  218.    line^.string.len:= s.len;
  219.   ELSE
  220.    Assign (string, line^.string.str);
  221.   END;
  222.   RETURN TRUE;
  223.  END;
  224.  RETURN FALSE;
  225. END PutLine;
  226.  
  227. PROCEDURE GetLine (line: LINE; VAR string: ARRAY OF CHAR);
  228. BEGIN
  229.  IF line # NIL THEN
  230.   IF line^.dyn THEN  Assign (line^.string.ptr^, string);
  231.                ELSE  Assign (line^.string.str, string);
  232.   END;
  233.  END;
  234. END GetLine;
  235.  
  236. PROCEDURE GetLinePtr (line: LINE): PtrString;
  237. BEGIN
  238.  IF line # NIL THEN
  239.   IF line^.dyn THEN  RETURN line^.string.ptr;
  240.                ELSE  RETURN ADR (line^.string.str);
  241.   END;
  242.  END;
  243.  RETURN NIL;
  244. END GetLinePtr;
  245.  
  246. PROCEDURE LengthLine (line: LINE): sCARDINAL;
  247. BEGIN
  248.  IF line # NIL THEN
  249.   IF line^.dyn THEN  RETURN SHORT (line^.string.len - 1);
  250.                ELSE  RETURN Length (line^.string.str);
  251.   END;
  252.  END;
  253. END LengthLine;
  254.  
  255. PROCEDURE DisposeLine (VAR line: LINE);
  256. BEGIN
  257.  IF line # NIL THEN
  258.   IF line^.last # NIL THEN  line^.last^.next:= line^.next;  END;
  259.   IF line^.next # NIL THEN  line^.next^.last:= line^.last;  END;
  260.   IF line^.dyn THEN  DEALLOCATE (line^.string.ptr, 0);    END;
  261.   DEALLOCATE (line, 0);  
  262.   line:= NIL;
  263.  END;
  264. END DisposeLine;
  265.  
  266. PROCEDURE FirstLine (text: TEXT): LINE;
  267. BEGIN
  268.  IF text # NIL THEN  RETURN text^.firstline;  END;
  269.  RETURN NIL;
  270. END FirstLine;
  271.  
  272. PROCEDURE LastLine (text: TEXT): LINE;
  273. BEGIN
  274.  IF text # NIL THEN  RETURN text^.lastline;  END;
  275.  RETURN NIL;
  276. END LastLine;
  277.  
  278. PROCEDURE NextLine (line: LINE): LINE;
  279. BEGIN
  280.  IF line # NIL THEN  RETURN line^.next;  END;
  281.  RETURN NIL;
  282. END NextLine;
  283.  
  284. PROCEDURE PrevLine (line: LINE): LINE;
  285. BEGIN
  286.  IF line # NIL THEN  RETURN line^.last;  END;
  287.  RETURN NIL;
  288. END PrevLine;
  289.  
  290. PROCEDURE NilLine (): LINE;
  291. BEGIN
  292.  RETURN NIL;
  293. END NilLine;
  294.  
  295. PROCEDURE GetNumber (text: TEXT): lCARDINAL;
  296. VAR d: LINE;
  297.     l: lCARDINAL;
  298. BEGIN
  299.  l:= 0;
  300.  IF text # NIL THEN
  301.   d:= text^.firstline;
  302.   WHILE d # NIL DO  INC (l);  d:= d^.next;  END;
  303.  END;
  304.  RETURN l;
  305. END GetNumber;
  306.  
  307. PROCEDURE FindNumber (text: TEXT; num: lCARDINAL): LINE;
  308. VAR l: lCARDINAL;
  309.     d: LINE;
  310. BEGIN
  311.  d:= NIL;
  312.  IF text # NIL THEN
  313.   l:= 1;  d:= text^.firstline;
  314.   WHILE (d # NIL) AND (l < num) DO  d:= d^.next;  INC (l);  END;
  315.  END;
  316.  RETURN d;
  317. END FindNumber;
  318.  
  319. PROCEDURE FindPos (text: TEXT; REF search: ARRAY OF CHAR; start: LINE;
  320.                    dir: SearchDir; VAR pos: sCARDINAL): LINE;
  321. VAR d: LINE;
  322.     l: sCARDINAL;
  323. BEGIN
  324.  d:= NIL;
  325.  IF text # NIL THEN
  326.   d:= start;
  327.   WHILE (d # NIL) DO
  328.    IF d^.dyn THEN
  329.     l:= SHORT (d^.string.len);
  330.     pos:= Pos (search, d^.string.ptr^, 0, FALSE);
  331.    ELSE
  332.     l:= Length (d^.string.str);
  333.     pos:= Pos (search, d^.string.str, 0, FALSE);
  334.    END;
  335.    IF pos > l THEN  d:= d^.next;  ELSE  RETURN d;  END;
  336.   END;
  337.  END;
  338.  RETURN NIL;
  339. END FindPos;
  340.  
  341. PROCEDURE ReadText (VAR text: TEXT; REF file: ARRAY OF CHAR): sINTEGER;
  342. VAR str:   ARRAY [0..MaxLength] OF CHAR;
  343.     tfile: TEXTFILE;
  344.     line:  LINE;
  345. BEGIN
  346.  IF text # NIL THEN
  347.   IF OpenTextfile (file, READ, 2048, tfile) THEN
  348.    WHILE NOT EndofText (tfile) DO
  349.     ReadLine (tfile, str);  ReadLn (tfile);
  350.     IF NewLine (line, str) THEN
  351.      InsertLine (text, line, text^.lastline);
  352.     ELSE
  353.      RETURN -1;
  354.     END;
  355.    END;
  356.    CloseTextfile (tfile);
  357.    RETURN 0;
  358.   END;
  359.  END;
  360.  RETURN -1;
  361. END ReadText;
  362.  
  363. PROCEDURE WriteText (text: TEXT; REF file: ARRAY OF CHAR): sINTEGER;
  364. VAR tfile: TEXTFILE;
  365.     line:  LINE;
  366. BEGIN
  367.  IF text # NIL THEN
  368.   IF OpenTextfile (file, WRITE, 2048, tfile) THEN
  369.    line:= FirstLine (text);
  370.    WHILE line # NIL DO
  371.     IF line^.dyn THEN  WriteLine (tfile, line^.string.ptr^);
  372.                  ELSE  WriteLine (tfile, line^.string.str);
  373.     END;
  374.     WriteLine (tfile, text^.eol); 
  375.     line:= line^.next;
  376.    END;
  377.    CloseTextfile (tfile);
  378.    RETURN 0;
  379.   END;
  380.  END;
  381.  RETURN -1;
  382. END WriteText;
  383.  
  384. PROCEDURE SetEndOfLine (text: TEXT; REF string: ARRAY OF CHAR);
  385. BEGIN
  386.  IF text # NIL THEN  Assign (string, text^.eol);  END;
  387. END SetEndOfLine;
  388.  
  389. END mtText.
  390.  
  391.